home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / utilities / emulators / apple2emul.lzh / dos.c < prev    next >
C/C++ Source or Header  |  1991-04-18  |  2KB  |  107 lines

  1. /*
  2.  *  a2, an Apple II emulator in C
  3.  *  (c) Copyright 1990 by Rich Skrenta
  4.  *
  5.  *  Command line interface written by Tom Markson
  6.  *
  7.  *  Distribution agreement:
  8.  *
  9.  *    You may freely copy or redistribute this software, so long
  10.  *    as there is no profit made from its use, sale, trade or
  11.  *    reproduction.  You may not change this copyright notice,
  12.  *    and it must be included prominently in any copy made.
  13.  *
  14.  *  Send emulator related mail to:  skrenta@blekko.commodore.com
  15.  *                    skrenta@blekko.uucp
  16.  */
  17.  
  18.  
  19. #include    <stdio.h>
  20. #include    "a2.h"
  21.  
  22.  
  23.  
  24. char *rwts_func[] = {"-s", "", "-w", "-?", "-f"};
  25.  
  26.  
  27. rwts() {
  28. char s[50];
  29. unsigned short iob;
  30. unsigned short buf;
  31. int track;
  32. int sector;
  33. int cmd;
  34. char zero_buf[256];
  35. int i;
  36.  
  37.     mem[0x48] = Y;
  38.     mem[0x49] = A;
  39.     mem[0x6F8] = 2;
  40.     mem[0x4F8] = 4;
  41.  
  42.     iob = join(Y, A);
  43.  
  44.     track = mem[iob + 4];
  45.     sector = mem[iob + 5];
  46.     buf = join(mem[iob + 8], mem[iob + 9]);
  47.     cmd = mem[iob + 12];
  48.  
  49.     if (cmd > 4)
  50.         cmd = 3;        /* unknown command */
  51.  
  52.     if (mem[iob + 2] == 2)
  53.         drive = 1;
  54.     else
  55.         drive = 0;
  56.  
  57.     if ((cmd == 2 || cmd == 4) && write_prot[drive]) {
  58.         C = 1;
  59.         mem[iob + 13] = 0x10;        /* Write protected */
  60.         DO_RTS;
  61.         return;
  62.     }
  63.  
  64.     if (mem[iob] != 1
  65.     ||  disk[drive] < 0
  66.     ||  track > 35
  67.     ||  sector > 15
  68.     ||  cmd == 3
  69.     ||  buf > 0xFE00) {
  70.         C = 1;
  71.         mem[iob + 13] = 0x40;        /* IO Error */
  72.         DO_RTS;
  73.         return;
  74.     }
  75.  
  76.     sprintf(s, "rwts%s t=%d s=%d%s", rwts_func[cmd],
  77.                 track, sector, drive ? " d2" : "");
  78.     info(s);
  79.  
  80.     switch (cmd) {
  81.     case 0:                    /* seek */
  82.         break;
  83.  
  84.     case 1:                    /* read */
  85.         read_disk(track, sector, &mem[buf]);
  86.         break;
  87.  
  88.     case 2:                    /* write */
  89.         write_disk(track, sector, &mem[buf]);
  90.         break;
  91.  
  92.     case 4:                    /* format */
  93.         for (i = 0; i < 256; i++)
  94.             zero_buf[i] = 0;
  95.  
  96.         for (track = 0; track < 35; track++)
  97.             for (sector = 0; sector < 16; sector++)
  98.                 write_disk(track, sector, zero_buf);
  99.         break;
  100.     }
  101.  
  102.     C = 0;
  103.     A = 0;
  104.     DO_RTS;
  105. }
  106.  
  107.